﻿using System.Collections.Specialized;
using System.Web;
using APILocawebGatewayUI.Nucleo;

namespace APILocawebGatewayUI.AMEX
{
    public class GerenciadorAmex
    {
        private HttpContext _context;
        public event ReenviadoHandler Reenviado;

        public GerenciadorAmex(HttpContext context)
        {
            _context = context;
        }

        /// <summary>
        /// Código de serviço de Comércio Eletrônico junto à Locaweb.
        /// </summary>
        internal string Identificacao
        {
            get { return APILocawebConfiguration.Instancia.Identificacao; }
        }

        /// <summary>
        /// Define o tipo de ambiente (teste ou producao).
        /// </summary>
        internal string Ambiente
        {
            get { return APILocawebConfiguration.Instancia.Amex.Ambiente; }
        }

        /// <summary>
        /// Valor da transação.
        /// </summary>
        public string Montante
        {
            get { return _context.Request["Amount"]; }
        }

        /// <summary>
        /// Idioma utilizado no ambiente Amex.
        /// </summary>
        internal string Idioma
        {
            get { return _context.Request["Locale"]; }
        }

        public string NumeroBatch
        {
            get { return _context.Request["BatchNo"]; }
        }

        /// <summary>
        /// Tipo de cartão utilizado na transação.
        /// </summary>
        public string Cartao
        {
            get { return _context.Request["Card"]; }
        }

        /// <summary>
        /// Campo Livre.
        /// </summary>
        public string CampoLivre
        {
            get { return _context.Request["OrderInfo"]; }
        }

        /// <summary>
        /// Número de recibo da transação
        /// </summary>
        public string NumeroRecibo
        {
            get { return _context.Request["ReceiptNo"]; }
        }

        /// <summary>
        /// ID de estabelecimento junto à operadora
        /// </summary>
        public string IdEstabelecimento
        {
            get { return _context.Request["Merchant"]; }
        }

        /// <summary>
        /// Número de autorização da transação
        /// </summary>
        public string NumeroDeAutorizacao
        {
            get { return _context.Request["AuthorizeId"]; }
        }

        /// <summary>
        /// Número de fatura da transação junto à loja (número do pedido - Não pode se repetir).
        /// </summary>
        public string NumeroDaFatura
        {
            get { return _context.Request["MerchTxnRef"]; }
        }

        /// <summary>
        /// Número da transação.
        /// </summary>
        public string NumeroTransacao
        {
            get { return _context.Request["TransactionNo"]; }
        }

        /// <summary>
        /// Código de retorno da transação
        /// </summary>
        public string CodigoRetornoTransacao
        {
            get { return _context.Request["TxnResponseCode"]; }
        }

        /// <summary>
        /// Transação ocorrida com sucesso.
        /// </summary>
        public bool EstaAprovada
        {
            get { return CodigoRetornoTransacao == "0"; }
        }

        /// <summary>
        /// Mensagem do status da transação
        /// </summary>
        public string MensagemRetorno
        {
            get { return AmexUtilidades.PegaStatusTransacao(_context.Request["TxnResponseCode"]); }
        }

        /// <summary>
        /// Mensagem de erro da transação
        /// </summary>
        public string MessagemErroTransacao
        {
            get { return _context.Request["Message"]; }
        }

        /// <summary>
        /// Valor total capturado
        /// </summary>
        public string ValorCapturado
        {
            get { return _context.Request["CapturedAmount"]; }
        }

        /// <summary>
        /// Valor pendente de captura
        /// </summary>
        public string ValorPendenteCaptura
        {
            get { return _context.Request["RefundedAmount"]; }
        }

        public string AcqResponseCode
        {
            get { return _context.Request["AcqResponseCode"]; }
        }

        public string ShopTransactionNo
        {
            get { return _context.Request["ShopTransactionNo"]; }
        }

        public string AuthorisedAmount
        {
            get { return _context.Request["AuthorisedAmount"]; }
        }

        public string TicketNumber
        {
            get { return _context.Request["TicketNumber"]; }
        }

        /// <summary>
        ///A captura é a forma do lojista confirmar que a compra realizada pelo consumidor será atendida. 
        ///Com isso evita-se o estorno de transações cujos produtos a loja não tem em seu estoque, 
        ///o estorno é um processo mais demorado e burocrático do que a não captura.
        /// </summary>
        public bool RealizarCaptura()
        {
            if (this.EstaAprovada)
            {
                if (Reenviado != null)
                {
                    Reenviado(this, new ReenviadoArgs(this.NumeroTransacao));
                }

                NameValueCollection queryString = new NameValueCollection
                                                      {
                                                          {"identificacao", this.Identificacao},
                                                          {"ambiente", this.Ambiente},
                                                          {"modulo", "AMEX"},
                                                          {"operacao", "Captura"},
                                                          {"MerchTxnRef", this.NumeroDaFatura},
                                                          {"TransactionNo", this.NumeroTransacao},
                                                          {"CaptureAmount", this.Montante}
                                                      };

                Utilidades.RequisicaoPOST(queryString);
                return true;
            }

            return false;
        }

    }
}